#pragma once 
// 这里是我们实现的一个消息路由的功能模块(也就是讲所有用户的消息都广播出去)
#include <iostream>
#include <sys/socket.h>
#include <vector>
#include "InetAddr.hpp"
#include "Log.hpp"
#include "Mutex.hpp"
using namespace  LogModule;
using namespace MutexModule;
class Route {
private:
    bool isExist(InetAddr& addr) {
        for(auto& e : _online_user) {
            if(e == addr) {
                return true;
            }
        }
        return false;
    }
    void addUser(InetAddr& addr) {
            _online_user.push_back(addr);
            LOG(LogLevel::INFO) << "新增了一个用户：" << addr.StringAddr();
    }
    void deleteUser(InetAddr& addr) {
        for(auto it = _online_user.begin(); it != _online_user.end(); it++) {
            if(*it == addr) {
                _online_user.erase(it);
                LOG(LogLevel::INFO) << "删除用户：" << addr.StringAddr();
                break;
            }
        }
    }
public:
    Route() {}
    void messageRoute(int sockfd, const std::string& message, InetAddr& addr) {
        LockGuard lockguard(_mutex);
        if(!isExist(addr)) {
            addUser(addr);
        }
        std::string send_message = addr.StringAddr() + "# " + message;
        for(auto& e : _online_user) {
            sockaddr_in addr = e.NetAddr();
            sendto(sockfd, send_message.c_str(), send_message.size(), 0, (sockaddr*)&addr, sizeof(addr)); // 广播出去所有的消息
        }
        // 判断用户是不是要退出了
        if(message == "Quit") {
            LOG(LogLevel::INFO) << "有一个用户退出：" << addr.StringAddr();
            deleteUser(addr);
        }
    }
    ~Route() {}
private:
    std::vector<InetAddr> _online_user; // 在线用户的集合
    Mutex _mutex;
};